const tab = {
  // 指令是具有一组生命周期的钩子： Vue3 中的自定义指令
  // 含参数 
  // el
  // 指令绑定到的元素。这可用于直接操作 DOM。

  // binding
  // 包含以下 property 的对象
  // instance：使用指令的组件实例。
  // value：传递给指令的值。例如，在 v-my-directive="1 + 1" 中，该值为 2。
  // oldValue：先前的值，仅在 beforeUpdate 和 updated 中可用。值是否已更改都可用。
  // arg：参数传递给指令 (如果有)。例如在 v-my-directive:foo 中，arg 为 "foo"。
  // modifiers：包含修饰符 (如果有) 的对象。例如在 v-my-directive.foo.bar 中，修饰符对象为 {foo: true，bar: true}。
  // dir：一个对象，在注册指令时作为参数传递。例如，在以下指令中

  // vnode
  // 上面作为 el 参数收到的真实 DOM 元素的蓝图。

  // prevNode
  // 上一个虚拟节点，仅在 beforeUpdate 和 updated 钩子中可用。


  // 在绑定元素的 attribute 或事件监听器被应用之前调用
  created() {},
  // 在绑定元素的父组件挂载之前调用
  beforeMount() {},
  // 绑定元素的父组件被挂载时调用 --- 用的最多
  mounted(el, binding) {
    // console.log(el, binding);
    
    const { className, activeClass, curIdx } = binding.value;

    const oItemBtns = el.getElementsByClassName(className);
    // console.log(oItemBtns);

    oItemBtns[curIdx].className += ` ${activeClass}`;
  },
  // 在包含组件的 VNode 更新之前调用
  beforeUpdate() {},
  // 在包含组件的 VNode 及其子组件的 VNode 更新之后调用 --- 用的最多
  updated(el, binding) {
    // console.log(el, binding); // 通过新值旧值对比修改
    const oldCurIdx = binding.oldValue.curIdx;
    const { className, activeClass, curIdx } = binding.value;
    const oItemBtns = el.getElementsByClassName(className);

    oItemBtns[oldCurIdx].className = className;
    oItemBtns[curIdx].className += ` ${activeClass}`;
  },
  // 在绑定元素的父组件卸载之前调用
  beforeUnmount() {},
  // 卸载绑定元素的父组件时调用
  unmounted() {}


  // --------------------------------

  // Vue2 中 用的最多的是 bind 和 update
}

export {
  tab
}
